#define  _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <math.h>
#include<windows.h>
#include <string.h>

//int Add(int a, int b) //a, b形式参数：如果只定义了函数而不调用，那么函数的参数只是形式上存在，不会向内存申请空间，不会真实存在，所以叫形式参数
//{
//    return a + b; //形式参数只有在函数调用的过程中为了存放实参传递过来的值，才向内存申请空间，这个过程就是形参的实例化
//} //形参是实参的临时拷贝


//void set_arr(int arr[], int sz)
//{
//    int i = 0;
//    for (i = 0; i < sz; i++)
//    {
//        arr[i] = -1;
//    }
//
//}
//
//void print_arr(int arr[], int sz)
//{
//    int i = 0;
//    printf("arr = ");
//    for (i = 0; i < sz; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    printf("\n");
//}

//=================================================

//void print_arr2(int arr[][4], int sz)
//{ 
//    int i = 0;
//    printf("arr = ");
//    for (i = 0; i < sz; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    printf("\n");
//}

//void print_arr2(int (*arr)[4], int sz)
//{
//    int i = 0;
//    printf("arr = ");
//    for (i = 0; i < sz; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    printf("\n");
//}

//void print_arr2(int arr[][4], int r, int c)//可以省略行，不可以省略列
//{
//    int i, j = 0;
//    printf("arr = \n");
//    for (i = 0; i < r; i++)
//    {
//        for (j = 0; j < c; j++)
//        {
//            printf("%d ", arr[i][j]);
//        }
//        printf("\n");
//    }
//    printf("\n");
//}

//=================================================

//int is_leap_year(int year)//判断闰年
//{
//    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
//        return 1;
//    else
//        return 0;
//}
//
//int get_days_of_month(int year, int month)//判断天数-->比swich函数简单
//{
//    int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
//    int d = days[month];
//
//    //判断闰年
//    if (is_leap_year(year) && (month == 2))
//        d += 1;
//    return d;
//}

//int main()
//{
    //库函数
    //printf("%.2lf\n", sqrt(9.0));
    //printf("%.2lf\n", sqrt(16.0));

    //自定义函数
    //int num1 = 0;
    //int num2 = 0;

    //printf("请输入两个加数的值：");
    //scanf("%d%d", &num1, &num2);
    //int res = Add(num1, num2); //实际参数
    //printf("res = %d\n", res);



    ////数组作函数参数
    //int arr[5] = { 1,2,3,4,5 };
    ////功能设置：写一个函数，将数组内容全部置为-1；打印数组内容
    ////参数设置：数组名、数组大小（元素个数）
    //int sz = sizeof(arr) / sizeof(arr[0]);

    //print_arr(arr, sz);
    //set_arr(arr, sz);
    //print_arr(arr, sz);

    //=========================================================

    ////二维数组传参 1:33:00
    //int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    //print_arr2(arr, 3, 4);

    //==========================================================

    //嵌套调用

    //计算某年某月有多少天
    //int year = 0;
    //int month = 0;
    //printf("请输入年、月：");
    //scanf("%d%d", &year, &month);

    //int days = get_days_of_month(year, month);

    //printf("天数为：%d\n", days);

    //system("pause");


    //============================================================
    
    //链式访问
    
    //size_t len = strlen("abcdef");
    //printf("len = %zd\n", len);
    //
    //printf("len = %zd\n", strlen("abcdef"));//链式访问


    //printf("%d", printf("%d", printf("%d", 43)));
    //printf("\n");
    //printf("%d\n", printf("%d\n", printf("%d\n", 43)));
    //printf的返回值是打印的字符个数（换行符也算）

//    return 0;
//}


//=======================================================

//函数定义和声明（单个文件）

////函数定义-->是特殊的声明
//int is_leap_year(int year)//判断闰年
//{
//    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
//        return 1;
//    else
//        return 0;
//}


//函数声明
//int is_leap_year(int year);
//
//int main()
//{
//    int year = 0;
//    scanf("%d", &year);
//
//    ////函数声明
//    //int is_leap_year(int year);
//    //在这里声明也可以，只要在函数调用之前声明就可以
//
//    if (is_leap_year(year)) //函数调用
//        printf("%d是闰年\n", year);
//    else
//        printf("%d不是闰年\n", year);
//
//    return 0;
//}
//
////如果函数定义放后面，会报错，函数未定义。因为代码从前往后顺序执行，先声明，再调用。
////解决方法：函数调用前先声明。
//int is_leap_year(int year)//判断闰年
//{
//    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
//        return 1;
//    else
//        return 0;
//}

//========================================================

//函数声明（多个文件）
#include "add.h" //包含声明函数的头文件
//add,h 和 add.c 相当于库函数，当成一个模块
//头文件中：
// 1.函数声明；
// 2.类型声明；
// ……

int main()
{
    int a, b = 0;
    scanf("%d%d", &a, &b);
    printf("%d\n", add(a, b));//函数调用

    return 0;
}


//项目中不会把所有代码放在一个文件中，而是放在多个文件中，多个文件之间通过头文件进行声明。
//通过不同模块/功能进行划分
// 1.add.h add.c
// 2.sub.h sub.c
// 3.mul.h mul.c
// 4.div.h div.c
// 
// 方便协作开发、测试、管理
// 
//！！包含头文件的作用就是告诉编译器，这个文件中有这个函数，这个函数的声明。
// 
// 使用头文件还可以隐藏代码的实现，只提供接口
// 可以把源代码 add.c 编译成静态库 add.lib ，和头文件 add.h 一起卖给用户，用户在使用的时候，只使用头文件，不提供源代码。
// 使用时需要链接静态库 #pragma comment(lib, "add.lib")
//